package com.itheima.book.manager.factory;

import com.itheima.book.manager.dao.BaseBookDao;
import com.itheima.book.manager.dao.Book2Dao;
import com.itheima.book.manager.dao.BookDao;
import com.itheima.book.manager.dao.BookFileDao;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class BookDaoFactory {

    // 这个方法的主要作用就是返回一个BookDao
    public static BaseBookDao getBookDao() {

        /**
         * 由于技术的局限性，我们目前没有办法不能改这一部分而实现数据存储的切换！！
         * 这种去更改代码来实现我们不同Dao的实现类的切换是不符合的开发原则(开闭原则)
         * 对扩展开放，对修改关闭
         * 怎么优化呢？我们的目标就是不更改代码而实现不同到ddao的灵活切换
         * 通过反射去实现。
         *
         * 思路：就是去创建一个文件(就是配置文件)，在该文件中去定义我们需要创建类对象对应的全类名，然后我们通过io流去
         * 读取文件中的内容，然后通过返回动态去创建该类对象；
         * 配置文件就是对软件在运行时所需要的一些信息进行配置
         *
         */

        try {

            // 1. 读取配置文件内容，将其加载到Properties集合中
            Properties properties = new Properties() ;
            properties.load(new FileInputStream("itheima-book-manager\\config\\book-dao-info.properties"));

            // 2. 从集合中获取book-dao-info的值
            String className = properties.getProperty("book-dao-info");

            // 3. 获取className所对应的字节码文件对象
            Class clazz = Class.forName(className);

            // 4. 创建这个Class的对象
            BaseBookDao baseBookDao = (BaseBookDao)clazz.newInstance() ;

            // 5. 返回
            return baseBookDao ;

        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;

    }

}
